xen/x86: Tweak #PF handler. Simplify gdbstub copy to/from guest.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Tue, 13 Mar 2007 14:04:31 +0000 (14:04 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Tue, 13 Mar 2007 14:04:31 +0000 (14:04 +0000)
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/gdbstub.c
xen/arch/x86/traps.c

index 8ed5e20298e0a5c4240ab073a3e5bc0e66f80aa5..a3af473ee2805feeeb2aacab57f85b91e86bce35 100644 (file)
@@ -73,38 +73,16 @@ gdb_arch_read_reg(unsigned long regnum, struct cpu_user_regs *regs,
 
 /* Like copy_from_user, but safe to call with interrupts disabled.
    Trust me, and don't look behind the curtain. */
-unsigned 
+unsigned int
 gdb_arch_copy_from_user(void *dest, const void *src, unsigned len)
 {
-    int __d0, __d1, __d2;
-    ASSERT(!local_irq_is_enabled());
-    __asm__ __volatile__(
-        "1: rep; movsb\n"
-        "2:\n"
-        ".section .fixup,\"ax\"\n"
-        "3:     addl $4, %%esp\n"
-        "       jmp 2b\n"
-        ".previous\n"
-        ".section __pre_ex_table,\"a\"\n"
-        "   "__FIXUP_ALIGN"\n"
-        "   "__FIXUP_WORD" 1b,3b\n"
-        ".previous\n"
-        ".section __ex_table,\"a\"\n"
-        "   "__FIXUP_ALIGN"\n"
-        "   "__FIXUP_WORD" 1b,2b\n"
-        ".previous\n"
-        : "=c"(__d2), "=D" (__d0), "=S" (__d1)
-        : "0"(len), "1"(dest), "2"(src)
-        : "memory");
-    ASSERT(!local_irq_is_enabled());
-    return __d2;
+    return copy_from_user(dest, src, len);
 }
 
 unsigned int 
 gdb_arch_copy_to_user(void *dest, const void *src, unsigned len)
 {
-    /* XXX  */
-    return len;
+    return copy_to_user(dest, src, len);
 }
 
 void 
index f6054857f49bc2e804729b9468aacb8ca1af5b2b..2423ad54935d7b2d9579c8f91c545fa53a066a13 100644 (file)
@@ -905,6 +905,10 @@ static int fixup_page_fault(unsigned long addr, struct cpu_user_regs *regs)
     struct vcpu   *v = current;
     struct domain *d = v->domain;
 
+    /* No fixups in interrupt context or when interrupts are disabled. */
+    if ( in_irq() || !(regs->eflags & X86_EFLAGS_IF) )
+        return 0;
+
     if ( unlikely(IN_HYPERVISOR_RANGE(addr)) )
     {
         if ( paging_mode_external(d) && guest_mode(regs) )
@@ -915,9 +919,6 @@ static int fixup_page_fault(unsigned long addr, struct cpu_user_regs *regs)
         return 0;
     }
 
-    ASSERT(!in_irq());
-    ASSERT(regs->eflags & X86_EFLAGS_IF);
-
     if ( VM_ASSIST(d, VMASST_TYPE_writable_pagetables) &&
          guest_kernel_mode(v, regs) &&
          /* Do not check if access-protection fault since the page may